---
title: 面向对象开发
description: 基本概念、面向对象开发的整个过程（面向对象分析、面向对象设计、面向对象实施，也叫做程序设计、面向对象的测试）
---




## 面向对象基本概念
### 类和对象
* 对象：由<font color='RedOrange'>数据及其操作所构成的封装体</font>，是系统中用来<font color='RedOrange'>描述客观事物的一个实体</font>，是构成系统的一个基本单位。一个对象通常可以由<font color='RedOrange'>对象名、属性和方法 </font>3 个部分组成。



* 类：现实世界中<font color='RedOrange'>实体的形式化描述</font>（是对象的抽象），类将该实体的属性（数据）和操作（函数）封装在一起。<font color='RedOrange'>对象是类的实例，类是对象的模板</font>。先有类后有对象。



* 类可以分为三种：<font color='RedOrange'>实体类、接口类（边界类）和控制类</font>。实体类的对象表示<font color='RedOrange'>现实世界中真实的实体</font>，如 人、物等。接口类（边界类）的对象<font color='RedOrange'>为用户提供一种与系统合作交互的方式</font>。分为人和系统两大类，其中人的接口可以是显示屏、窗口、Web 窗体、对话框、菜单、列表框、其它显示控制、条形码、二维码或者用户与系统交互的其它方法。系统接口涉及到把数据发送到其它系统，或者从其它系统接受数据。控制类的对象用来<font color='RedOrange'>控制活动流，充当协调者</font>。

:::tip

学生参加考试，通过笔手写，笔就是边界类。学生交卷的时候，需要一个一个交，这个时候就需要一个控制类。用来控制某个业务流。

:::

### 面向对象四大特征

* 抽象：通过<font color='RedOrange'>特定的实例抽取共同特征以后形成概念的过程。它强调主要特征、忽略次要特征</font>。一个对象是现实世界中一个实体的抽象，一个类是一组对象的抽象，抽象是一种单一的描述，它强调给出与应用相关的特性，抛弃不相关的特性。



* 封装：是一种<font color='RedOrange'>信息隐藏技术</font>，将相关的概念组成一个单元模块，并通过一个名称来引用。面向对象封装是将数据和基于数据的操作封装成一个整体对象，对数据的访问或修改只能通过对象对外提供的接口进行。



* 继承：<font color='RedOrange'>表示类之间的层次关系（父类和子类），这种关系使得某类对象可以继承另一类对象的特征，又可分为单继承和多继承</font>。



* 多态：<font color='RedOrange'>不同的对象收到同一个消息时产生完全不同的结果，包括参数多态（不同类型参数多种数据结构）、包含多态（父子类型关系）、过载多态（类似于重载，一个名字不同含义）、强制多态（强制类型转换）四种类型</font>。多态由继承机制支持，将通用消息放在抽象层，具体不同的功能实现放在底层。


### 其它概念
* 接口：描述对操作规范的说明，只说明<font color='RedOrange'>操作应该做什么</font>。并没有定义操作如何做。



* 消息：体现<font color='RedOrange'>对象间的交互</font>，通过它向目标对象发送操作请求。



* 覆盖：子类在原有父类接口的基础上，用<font color='RedOrange'>适合自己要求的实现去置换父类中的相应实现</font>。即在子类中重定义一个与父类同名同参的方法。



* 函数重载：与覆盖要区分开，函数重载与子类父类无关，且函数名是<font color='RedOrange'>同名不同参数</font>。



* 绑定是一个把<font color='RedOrange'>过程调用和响应调用所需执行的代码加以结合</font>的过程。在一般的程序设计语言中，绑定是<font color='RedOrange'>在编译时进行的，叫做静态绑定</font>。动态绑定则是<font color='RedOrange'>在运行时进行的</font>，因此，一个给定的过程调用和代码的结合直到调用发生时才进行。
##  面向对象开发
### 面向对象分析（做什么？）

* 面向对象分析是为了<font color='RedOrange'>确定问题域、理解问题</font>。包含五个活动：<font color='RedOrange'>认定对象、组织对象、描述对象间的相互作用、确定对象的操作、定义对象的内部信息</font>。



* 面向对象需求建模，两种模型（需要记住）：

    ![image-20240916142845273](https://wkq-img.oss-cn-chengdu.aliyuncs.com/img/202409161428815.png)




* 建立用例模型就是建立 UML 中的用例图，用例图可以反映系统中的参与者和系统用例的关系。



* 静态分析模式：类图、对象图

* 动态分析模型：活动图、序列图

:::tip
用例模型用于需求获取，也可以用事件风暴，

分析模型用于需求定义，分析模型也可以成为领域模型。
:::
### 面向对象设计（怎么做？）

* 面向对象设计： 是<font color='RedOrange'>设计分析模型和实现相应源代码</font>，设计问题域的解决方案，与技术相关。OOD 同样遵循抽象、信息隐蔽、功能独立、模块化等设计准则。



* 面向对象的<font color='RedOrange'>分析模型</font>主要由<font color='RedOrange'>顶层架构图、用例和用例图、领域概念模型构成</font>；



* 设计模型则<font color='RedOrange'>包含以包图表示的软件体系结构图(体系结构就是架构)、以交互图表示的用例实现图、完整精确的类图、针对复杂对象的状态图和用以描述流程化处理过程的活动图等</font>。

![image-20240916143753813](https://wkq-img.oss-cn-chengdu.aliyuncs.com/img/202409161437549.png)

### 面向对象的测试

和软件工程中的测试没有什么大的区别，同样也分黑盒、白盒测试，单元测试、集成测试。唯一的不同是这里有四个层次。



一般来说，对面向对象软件的测试可分为下列 4 个层次进行。

1. <font color='RedOrange'>算法层</font>： 测试<font color='RedOrange'>类中定义的每个方法</font>，基本上相当于传统软件测试中的单元测试。
2. <font color='RedOrange'>类层</font>：测试封装在<font color='RedOrange'>同一个类中的所有方法与属性之间的相互作用</font>。在面向对象软件中类是基本模块，因此可以认为这是面向对象测试中所特有的模块测试。
3. <font color='RedOrange'>模板层</font>：测试<font color='RedOrange'>一组协同工作的类之间的相互作用</font>，大体上相当于传统软件测试中的集成测试，但是也有面向对象软件的特点（例如：对象之间通过发送消息互相作用）。
4. <font color='RedOrange'>系统层</font>：把<font color='RedOrange'>各个子系统组装成完整的面向对象软件系统</font>，在组装过程中同时进行测试。

## 面向对象设计原则

1. <font color='RedOrange'>单一职责原则</font>：就某一个类而言，应该<font color='RedOrange'>仅有一个引起它变化的原因</font>。即，当需要修改某个类的时候原因有且只有一个。
2. <font color='RedOrange'>开放、封闭原则</font>： 软件实体（类、模块、函数等）应该是<font color='RedOrange'>可以扩展的，即开放的，但是不可修改的，即封闭的</font>。
3. <font color='RedOrange'>里氏替换原则</font>：<font color='RedOrange'>子类型必须能够替换掉它们的基类型</font>。即，在任何父类可以出现的地方，都可以用子类的实例来赋值给父类型的引用。
3. <font color='RedOrange'>依赖倒置原则</font>：<font color='RedOrange'>抽象不应该依赖于细节，细节应该依赖于抽象</font>。即，高层模块不应该依赖于底层模块，二者都应该依赖于抽象。
3. <font color='RedOrange'>接口分离原则</font>：不应该强迫客户依赖于它们不用的方法。接口属于客户，不属于它所在类的层次结构。即依赖于抽象、不要依赖于具体。即：<font color='RedOrange'>依赖于抽象，不要依赖于具体</font>，同时在抽象级别不应该有对于细节的依赖。这样做的好处就在于可以最大限度地应对可能的变化。
